/*!
 * \file IDataFactory.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 数据工厂接口定义
 * \details 定义了数据处理和拼接的核心接口，负责K线数据的更新、提取和合并操作
 */
#pragma once
#include <stdint.h>
#include "../Includes/WTSTypes.h"

//USING_NS_WTP;

NS_WTP_BEGIN
class WTSKlineData;
class WTSHisTrendData;
class WTSTickData;
class WTSSessionInfo;
class WTSKlineSlice;
class WTSContractInfo;
struct WTSBarStruct;
struct WTSTickStruct;
class WTSTickSlice;

/**
 * @class IDataFactory
 * @brief 数据工厂接口
 * @details 负责各种数据的拼接、处理和转换操作，是数据处理模块的核心接口。
 *          主要功能包括：
 *          - 基于tick数据更新K线数据
 *          - 基于基础K线数据生成复合周期K线
 *          - 从不同数据源提取K线数据
 *          - K线数据的合并操作
 *          
 *          该接口采用纯虚函数设计，具体实现由子类提供，支持多种数据处理策略。
 */
class IDataFactory
{
public:
	/**
	 * @brief 基于tick数据更新K线
	 * @details 将新的tick数据融入到现有的K线数据中，更新最新的K线Bar。
	 *          此方法用于实时数据处理，在收到新的tick时更新当前未完成的K线。
	 * 
	 * @param klineData K线数据对象，包含历史K线序列
	 * @param tick 新的tick数据，包含最新的市场报价信息
	 * @param sInfo 交易时间模板，用于判断交易时段和K线周期边界
	 * @return WTSBarStruct* 更新后的K线Bar结构，如果无更新则返回nullptr
	 */
	virtual WTSBarStruct*	updateKlineData(WTSKlineData* klineData, WTSTickData* tick, WTSSessionInfo* sInfo)						= 0;

	/**
	 * @brief 基于基础K线数据更新复合K线
	 * @details 使用新的基础K线Bar来更新复合周期的K线数据。
	 *          例如用1分钟K线更新5分钟K线，或用日K线更新周K线等。
	 * 
	 * @param klineData 目标K线数据对象，待更新的复合周期K线
	 * @param newBasicBar 新的基础K线Bar，作为更新源
	 * @param sInfo 交易时间模板，用于确定复合周期的边界
	 * @return WTSBarStruct* 更新后的K线Bar结构，如果无更新则返回nullptr
	 */
	virtual WTSBarStruct*	updateKlineData(WTSKlineData* klineData, WTSBarStruct* newBasicBar, WTSSessionInfo* sInfo)				= 0;

	/**
	 * @brief 从基础K线数据中提取指定周期的K线数据
	 * @details 从现有的基础K线切片中提取出指定周期和倍数的K线数据。
	 *          支持多种周期转换，如从1分钟提取5分钟、从日线提取周线等。
	 * 
	 * @param baseKline 基础K线切片数据，作为数据源
	 * @param period 目标周期类型，如m1/m5/day等
	 * @param times 周期倍数，如5表示5倍基础周期
	 * @param sInfo 交易时间模板，用于周期边界计算
	 * @param bIncludeOpen 是否包含未完成的K线Bar，默认为true
	 * @return WTSKlineData* 提取出的K线数据对象，失败返回nullptr
	 */
	virtual WTSKlineData*	extractKlineData(WTSKlineSlice* baseKline, WTSKlinePeriod period, uint32_t times, WTSSessionInfo* sInfo, bool bIncludeOpen = true) = 0;

	/**
	 * @brief 从tick数据中提取指定秒数周期的K线数据
	 * @details 直接从tick数据序列中生成指定秒数的K线数据。
	 *          适用于高频数据处理和自定义周期K线生成。
	 * 
	 * @param ayTicks tick数据切片，包含tick序列
	 * @param seconds 目标K线周期（秒），如60表示1分钟K线
	 * @param sInfo 交易时间模板，用于交易时段判断
	 * @param bUnixTime tick时间戳是否为unix时间格式，默认为false
	 * @return WTSKlineData* 生成的K线数据对象，失败返回nullptr
	 */
	virtual WTSKlineData*	extractKlineData(WTSTickSlice* ayTicks, uint32_t seconds, WTSSessionInfo* sInfo, bool bUnixTime = false) = 0;

	/**
	 * @brief 合并K线数据
	 * @details 将新的K线数据合并到目标K线数据中，用于数据拼接和历史数据更新。
	 *          合并时会按时间顺序整理，去除重复数据。
	 * 
	 * @param klineData 目标K线数据对象，作为合并的目标
	 * @param newKline 新的K线数据，待合并的数据源
	 * @return bool 合并是否成功，true表示成功，false表示失败
	 */
	virtual bool			mergeKlineData(WTSKlineData* klineData, WTSKlineData* newKline)											= 0;
};

NS_WTP_END
